/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package amazonjava;
import java.util.*;



/*
* L'esercizio di oggi consiste nella gestione simulata di un sito
* tipo Amazon per la vendita online
*/


// Per prima cosa si definisca la classe Articolo che rappresenta un
// oggetto nel catalogo del nostro sito. Ogni Articolo e' caratterizzato
// dal codice (una stringa) e dal suo prezzo (un intero). La classe Articolo
// deve contenere i seguenti metodi
class Articolo {
        int prezzo;
        String codice;
  // costruttore:
    Articolo(int p, String c){
        codice=c;
        prezzo=p;
    }
  // crea un Articolo di prezzo p e codice c

  public String toString(){
      String s;
        s="prezzo:" + prezzo;
        s+="codice:" + codice;
      return s;
    }
  // restituisce una stringa contenente prezzo e codice dell'articolo
  // vedere esempi in fondo al file

 public boolean equals(Articolo o){
     if (o instanceof Articolo)
      return  codice.equals(o.codice);
    return false;
     }
  // confronta l'articolo this con l'oggetto o.
  // restituisce false se o non e' un oggetto oppure se e' un oggetto
  // ma ha un codice diverso da this. Restituisce true se o e' Articolo
  // con lo stesso codice di this
}

// Si definisca poi la classse Libro sottoclasse di Articolo
// contenente i seguenti metodi:
class Libro extends Articolo {
      String autore,titolo;
    // costruttore: 
    Libro(String aut, String tit, int p, String cod){
        super(p,cod);
        autore=aut;
        titolo=tit;
    }
    // crea un Libro con autore aut, titolo tit, prezzo p e codice cod

     public String toString(){
        String s;
        s= "libro -> a:" + autore;
        s+="t:" + titolo;
        s+= super.toString();
     return s;
    }
    // restituisce una stringa contenente l'indicazione che si tratta di un

    // e contenente autore titolo prezzo e codice del libro
    // (si veda esempio in fondo al file)
}

// Si definisca poi la classse LibroGiallo sottoclasse di Libro
// contenente i seguenti metodi:
class LibroGiallo extends Libro {
    String protagonista;
    // costruttore: 
    LibroGiallo(String aut, String tit, String pro, int p,String cod){
    super(aut,tit,p,cod);
    protagonista=pro;
    }
    // crea un Libro con autore aut, titolo tit, protagonista pro, prezzo p e
//codice cod


     public String toString(){
     String s;
     s = super.toString();
     s+="(protagonista:" + protagonista + ")";
     return s;
     }
    // restituisce una stringa contenente l'indicazione che si tratta di un
//libro
    // e contenente autore titolo prezzo codice e nome del protagonista
    // (si veda esempio in fondo al file)

}

// Si definisca poi la classse Dvd sottoclasse di Articolo
// contenente i seguenti metodi:
class Dvd extends Articolo {
        String regista,titolo;
    // costruttore:
        Dvd(String reg, String tit, int p, String cod){
        super(p,cod);
        regista=reg;
        titolo=tit;
        }
    // crea un Libro con regista reg, titolo tit, prezzo p, e codice cod

     public String toString(){
        String s;
        s= "DVD -> a:" + regista;
        s+="t:" + titolo;
        s+= super.toString();
     return s;
     }
    // restituisce una stringa contenente l'indicazione che si tratta di un dvd
    // e contenente regista titolo prezzo codice
    // (si veda esempio in fondo al file)
}


// Si scriva poi la classe Amazon per la gestione del catalogo degli articoli
// La classe deve avere come variabile di istanza un array nel quale vengono
// memorizzati gli articoli presenti in catalogo.
// La classe deve contenere i seguenti metodi
class Amazon {
       Articolo[] articoli;
       int dimmax,num_oggetti;
       Articolo[] risarray;

    // costruttore: 
    Amazon(int max_articoli){
        dimmax=max_articoli;
        articoli= new Articolo[dimmax];
        num_oggetti=0;
    }
    // crea un catalogo che puo' contenere al massimo max_articoli
    // articoli (e' necessario stabilire un massimo per potere allocare
    // un array che rappresenta il catalogo).
    // Inizialmente il catalogo e' vuoto (non contiene articoli)

     boolean aggiungi_articolo(Articolo a){
         int i=0;
        if (num_oggetti<dimmax){
            for (i=0;i<num_oggetti;i++){
               if (a.equals(articoli[i]))
                  return false;
            }
           articoli[i+1]=a;
           return true;
        }
        return false;
     }
    // tenta di aggiungere l'articolo a al catalogo. L'articolo puo' essere
    // aggiunto se non si e' raggiunta la capienza massima del catalogo
    // e se a e' diverso da tutti gli oggetti gia' presenti in catalogo
    // (diverso nel senso del metodo equals della classe articolo)
    // Il metodo restituisce true se l'articolo viene aggiunto, false
    //altrimenmti.

     public String toString(){
    int i;
    String s="";
    for (i=0;i<num_oggetti;i++){
        s+= articoli[i].toString()+ "\n";
     }
     return s;
     }
    // restituisce una stringa contenete tutti gli articoli
    // presenti in catalogo (separati da "\n" quindi uno per riga).
    // I singoli articoli devono rappresentati chiamando i relativi metodi
    //toString

   int cerca_dvd(String s){
    int i;
    int ris=0;
    for (i=0;i<num_oggetti;i++){
        if (articoli[i] instanceof Dvd && ((Dvd) articoli[i]).titolo.contains(s))
            ris++;
       }
    return ris;
 }
  // restituisce il numero di dvd in catalogo che contengono la stringa s nel
//titolo

  int cerca_detective(String d){
  int i,ris=0;
        for (i=0;i<num_oggetti;i++){
      if   (articoli[i] instanceof LibroGiallo && (((Libro) articoli[i]).autore.equalsIgnoreCase(d)))  
          ris++;
      }
  return ris;  
  }
          
}
  // restituisce il numero di libri gialli in catalogo il cui protagonista e' d
/*
   LibroGiallo cerca_libro_economico(String s){
   int i,j=0;
   risarray= new Articolo[dimmax];
   LibroGiallo ris=null;
   for (i=0;i<num_oggetti;i++){
    if (articoli[i] instanceof LibroGiallo && ((LibroGiallo) articoli[i]).titolo.contains(s)){
                risarray[j]=articoli[i];
                j++;
    }}
        if (j!=0){
            risarray.sort(risarray[i].prezzo);
            }
   }
   return ris;
   }
  // restituisce il libro che costa meno tra tutti quelli che il cui titolo
  // contiene la stringa s. Restituisce null se non ci sono libri che
  // contengono la stringa s nel titolo
  }



}




/**
*
* Per testare il vostro codice potete usare il metodo main qui sotto che
* dovrebbe produrre un output simile a quello riportato in fondo al file
*
*/
  
public class Main {

    
     //@param args the command line arguments;
    
    
    public static void main(String[] args) {
        System.out.println( "=== Inizio test ===");

        Amazon negozio = new Amazon(1000);
        Libro bau = new Libro("Eco", "Baudolino", 25, "Eco1");
        System.out.println(bau.equals("Eco1"));
        System.out.println(negozio.aggiungi_articolo(bau));
        System.out.println(negozio.aggiungi_articolo(new Dvd("Kubrick",
                "Spartacus", 20, "Kub1")));

        // stampa situazione
        System.out.println( negozio);

        // inserimenti con codice duplicato
        System.out.println(negozio.aggiungi_articolo(new Dvd("Kubrick",
            "Mary Poppins", 10, "Kub1")));
        System.out.println(negozio.aggiungi_articolo(new Dvd("Kubrick",
            "Mary Poppins", 10, "Eco1")));
        System.out.println(negozio.aggiungi_articolo(new LibroGiallo("Obi-wan Kenobi",
        "My friend Anakin", "Master Yoda", 3, "An1")));


        // aggiunge libri
        negozio.aggiungi_articolo(new Libro("Tolkien", "Lo Hobbit", 9,
"Bilbo"));
        negozio.aggiungi_articolo(new Libro("Tolkien",
          "Il signore degli anelli", 28, "Tol3"));
        negozio.aggiungi_articolo(new Libro("Eco",
          "Il nome degli anelli", 20, "Eco3"));
        negozio.aggiungi_articolo(new Libro("Eco",
          "Il pendolo degli anelli", 18, "Eco5"));
        negozio.aggiungi_articolo(new Libro("Eco",
          "L'anello del giorno dopo", 12, "Eco6"));
        negozio.aggiungi_articolo(new Libro("Moccia",
          "Lucchetti anelli e catene", 15, "Mo1"));
        negozio.aggiungi_articolo(new Libro("Moccia",
          "Lucchetti anelli e chiavi", 13, "Mo2"));
        negozio.aggiungi_articolo(new Libro("Wagner", "L'anello del Nibelungo",2,"Wa1"));

        negozio.aggiungi_articolo(new LibroGiallo("Camilleri",
          "Il ladro di anelli", "Montalbano", 15, "Cam1"));
        negozio.aggiungi_articolo(new LibroGiallo("Camilleri",
          "L'anello di terracotta", "Montalbano", 8, "Cam2"));
        negozio.aggiungi_articolo(new LibroGiallo("Christie",
          "Death on the Nile", "Poirot", 7, "AC1"));
        negozio.aggiungi_articolo(new LibroGiallo("Christie",
          "Curtain", "Poirot", 7, "AC2"));

        // aggiungiamo DVD
        negozio.aggiungi_articolo(new Dvd("Kubrick",
          "L'occhio meccanico", 15, "Kub3"));
        negozio.aggiungi_articolo(new Dvd("Jackson",
          "Il signore degli anelli", 20, "Jak1"));
        negozio.aggiungi_articolo(new Dvd("Benigni", "Pinocchio", 20, "Be1"));
        negozio.aggiungi_articolo(new Dvd("Comencini", "Pinocchio", 19,
"Com1"));
        negozio.aggiungi_articolo(new Dvd("Comencini", "Ranocchio", 15,
"Com2"));

        System.out.println( negozio);

        System.out.println( "--- cerca dvd ---");
        System.out.println( negozio.cerca_dvd("chi"));
        System.out.println( negozio.cerca_dvd("li"));

        System.out.println( "--- cerca detective ---");
        System.out.println( negozio.cerca_detective("Montalbano"));
        System.out.println( negozio.cerca_detective("Poirot"));
        System.out.println( negozio.cerca_detective("Moccia"));
/*
        System.out.println( "--- cerca libro economico ---");
        System.out.println( negozio.cerca_libro_economico("java"));
        System.out.println( negozio.cerca_libro_economico("ladro"));
        System.out.println( negozio.cerca_libro_economico("anello"));
        System.out.println( negozio.cerca_libro_economico("anelli"));
        System.out.println( negozio.cerca_libro_economico("gli anelli"));
        System.out.println( negozio.cerca_libro_economico("anello de"));
        System.out.println( negozio.cerca_libro_economico("catene"));
*/
        System.out.println( "=== Fine test ===");

    }

    }


/*
=== Inizio test ===
false
true
true
--- Articoli in catalogo ---
LIBRO -> A: Eco,  T: Baudolino, Prezzo: 25, Codice: Eco1
DVD -> Reg: Kubrick,  T: Spartacus Prezzo: 20, Codice: Kub1
--- fine catalogo
false
false
true
--- Articoli in catalogo ---
LIBRO -> A: Eco,  T: Baudolino, Prezzo: 25, Codice: Eco1
DVD -> Reg: Kubrick,  T: Spartacus Prezzo: 20, Codice: Kub1
LIBRO -> A: Obi-wan Kenobi,  T: My friend Anakin, Prezzo: 3, Codice: An1
(Protagonista: Master Yoda)
LIBRO -> A: Tolkien,  T: Lo Hobbit, Prezzo: 9, Codice: Bilbo
LIBRO -> A: Tolkien,  T: Il signore degli anelli, Prezzo: 28, Codice: Tol3
LIBRO -> A: Eco,  T: Il nome degli anelli, Prezzo: 20, Codice: Eco3
LIBRO -> A: Eco,  T: Il pendolo degli anelli, Prezzo: 18, Codice: Eco5
LIBRO -> A: Eco,  T: L'anello del giorno dopo, Prezzo: 12, Codice: Eco6
LIBRO -> A: Moccia,  T: Lucchetti anelli e catene, Prezzo: 15, Codice: Mo1
LIBRO -> A: Moccia,  T: Lucchetti anelli e chiavi, Prezzo: 13, Codice: Mo2
LIBRO -> A: Wagner,  T: L'anello del Nibelungo, Prezzo: 2, Codice: Wa1
LIBRO -> A: Camilleri,  T: Il ladro di anelli, Prezzo: 15, Codice: Cam1
(Protagonista: Montalbano)
LIBRO -> A: Camilleri,  T: L'anello di terracotta, Prezzo: 8, Codice: Cam2
(Protagonista: Montalbano)
LIBRO -> A: Christie,  T: Death on the Nile, Prezzo: 7, Codice: AC1
(Protagonista: Poirot)
LIBRO -> A: Christie,  T: Curtain, Prezzo: 7, Codice: AC2 (Protagonista: Poirot)
DVD -> Reg: Kubrick,  T: L'occhio meccanico Prezzo: 15, Codice: Kub3
DVD -> Reg: Jackson,  T: Il signore degli anelli Prezzo: 20, Codice: Jak1
DVD -> Reg: Benigni,  T: Pinocchio Prezzo: 20, Codice: Be1
DVD -> Reg: Comencini,  T: Pinocchio Prezzo: 19, Codice: Com1
DVD -> Reg: Comencini,  T: Ranocchio Prezzo: 15, Codice: Com2
--- fine catalogo
--- cerca dvd ---
4
1
--- cerca detective ---
2
2
0
--- cerca libro economico ---
null
LIBRO -> A: Camilleri,  T: Il ladro di anelli, Prezzo: 15, Codice: Cam1
(Protagonista: Montalbano)
LIBRO -> A: Wagner,  T: L'anello del Nibelungo, Prezzo: 2, Codice: Wa1
LIBRO -> A: Moccia,  T: Lucchetti anelli e chiavi, Prezzo: 13, Codice: Mo2
LIBRO -> A: Eco,  T: Il pendolo degli anelli, Prezzo: 18, Codice: Eco5
LIBRO -> A: Wagner,  T: L'anello del Nibelungo, Prezzo: 2, Codice: Wa1
LIBRO -> A: Moccia,  T: Lucchetti anelli e catene, Prezzo: 15, Codice: Mo1
=== Fine test ===
*/
